home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / FREQ.TST / KSFREQ.C < prev    next >
Text File  |  1995-12-14  |  2KB  |  61 lines

  1. /* ============ */
  2. /* ksfreq.c    */
  3. /* ============ */
  4. /* -------------------------------- */
  5. /* WorkArea is defined in freqtst.c */
  6. /* -------------------------------- */
  7. #define    RandNum    WorkArea
  8.  
  9. #define MAX_SAMPS  ((unsigned)RAND_MAX + 1u)
  10.  
  11. static  int  IntCmprFun(const void *Key, const void *Elem)
  12. {
  13.     return (*(int *) Key - *(int *) Elem);
  14. }
  15. /* ==================================================================== */
  16. /* KSFreq - Kolmogorov-Smirnov Statistics Kn+ & Kn- and Probabilities    */
  17. /* ==================================================================== */
  18. void
  19. KSFreq(KS_DATA_STRU  *KSData)
  20. {
  21.     UINT    i, J, NumGen;
  22.     double  KSVal, MaxKnMinus, MaxKnPlus, NextKn;
  23.  
  24.     NumGen = (KSData->SampleSize <= MAX_SAMPS) ?
  25.         KSData->SampleSize : MAX_SAMPS;
  26.  
  27.     for (i = 0; i < NumGen; ++i)
  28.     {
  29.     int    NextRand = KSData->RandFun();
  30.     RandNum[i] = NextRand;
  31.     }
  32.  
  33.     /* --------------------------- */
  34.     /* Counting Variates Generated */
  35.     /* --------------------------- */
  36.     KSData->TotNumGen += NumGen;
  37.  
  38.     /* -------------------------------------- */
  39.     /* Calculate Statistics and Probabilities */
  40.     /* -------------------------------------- */
  41.     qsort((void *)RandNum, NumGen, sizeof(int), IntCmprFun);
  42.  
  43.     MaxKnMinus = MaxKnPlus = 0;
  44.     for (J = 1; J <= NumGen; ++J)
  45.     {
  46.     KSVal = (double)RandNum[J-1]/(double)MAX_SAMPS;
  47.  
  48.     NextKn = (double)J/(double)NumGen - KSVal;
  49.     MaxKnPlus = __max(MaxKnPlus, NextKn);
  50.  
  51.     NextKn = 1.0/(double)NumGen - NextKn;
  52.     MaxKnMinus = __max(MaxKnMinus, NextKn);
  53.     }
  54.  
  55.     KSData->KnMinus = MaxKnMinus;
  56.     KSData->KnPlus  = MaxKnPlus;
  57.  
  58.     KSData->KnMinusProb = KSmirnov(NumGen, MaxKnMinus);
  59.     KSData->KnPlusProb  = KSmirnov(NumGen, MaxKnPlus);
  60. }
  61.